import * as crypto from 'crypto';

/**
 * 提供加密服务的类，使用RSA算法进行加密和解密操作。
 */
export class EncryptUtil {
  private static KEY_LENGTH = 2048; // 密钥长度
  private static PRIVATE_KEY: string;
  private static PUBLIC_KEY: string;

  constructor() {}

  /**
   * 初始化加密服务，生成RSA密钥对。
   */
  private static async init() {
    const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
      modulusLength: EncryptUtil.KEY_LENGTH,
      publicKeyEncoding: {
        type: 'spki',
        format: 'pem',
      },
      privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem',
      },
    });

    EncryptUtil.PUBLIC_KEY = publicKey;
    EncryptUtil.PRIVATE_KEY = privateKey;
  }

  /**
   * 使用私钥解密数据。
   * @param data 待解密的数据，Base64编码的字符串。
   * @returns 返回解密后的数据字符串。
   */
  static async decrypt(data: string): Promise<string> {
    const buffer = Buffer.from(data, 'base64');
    const decrypted = crypto.privateDecrypt(
      {
        key: EncryptUtil.PRIVATE_KEY,
        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
        oaepHash: 'sha256',
      },
      buffer
    );
    return decrypted.toString('utf8');
  }

  /**
   * 获取公钥。
   * 如果公钥尚未生成，则先调用`init`方法生成公钥。
   * @returns 返回公钥字符串。
   */
  static async getPublicKey(): Promise<string> {
    if (!EncryptUtil.PUBLIC_KEY) {
      await EncryptUtil.init();
    }

    return EncryptUtil.PUBLIC_KEY;
  }
}
